package services

import (
	"context"

	"go-agent/pkg/client"

	"github.com/sirupsen/logrus"
)

// MetricsSender 指标发送器（简化版，直接发送，无需缓冲和锁）
type MetricsSender struct {
	client *client.DeviceMonitorClient
	logger *logrus.Logger
}

// MetricsSenderConfig 指标发送器配置（简化版）
type MetricsSenderConfig struct {
	Enabled bool `mapstructure:"enabled"`
}

// NewMetricsSender 创建指标发送器
func NewMetricsSender(client *client.DeviceMonitorClient, logger *logrus.Logger, config *MetricsSenderConfig) *MetricsSender {
	return &MetricsSender{
		client: client,
		logger: logger,
	}
}

// Start 启动指标发送器（简化版，无需启动流程）
func (ms *MetricsSender) Start(ctx context.Context) error {
	ms.logger.Info("指标发送器已启动（简化模式，直接发送）")
	return nil
}

// Stop 停止指标发送器（简化版，无需停止流程）
func (ms *MetricsSender) Stop() error {
	ms.logger.Info("指标发送器已停止")
	return nil
}

// SendMetric 发送单个指标（直接发送，无缓冲）
func (ms *MetricsSender) SendMetric(itemID int64, value interface{}, metadata map[string]interface{}) error {
	ctx := context.Background()
	return ms.SendMetricImmediate(ctx, itemID, value)
}

// SendMetricImmediate 立即发送指标（直接推送，不管返回结果）
func (ms *MetricsSender) SendMetricImmediate(ctx context.Context, itemID int64, value interface{}) error {
	// 处理数组类型的值，只取第一个元素
	processedValue := ms.processValue(value)

	// 直接推送，不等待结果，不处理错误
	go func() {
		ms.client.SendSingleMetric(ctx, itemID, processedValue)
		ms.logger.Debug("推送指标", map[string]interface{}{
			"item_id": itemID,
			"value":   processedValue,
		})
	}()

	return nil
}

// processValue 处理指标值，根据接口要求处理数组类型
func (ms *MetricsSender) processValue(value interface{}) interface{} {
	if value == nil {
		return value
	}

	// 检查是否为数组类型
	switch v := value.(type) {
	case []interface{}:
		// 如果是数组，只取第一个元素
		if len(v) > 0 {
			ms.logger.Debug("处理数组类型值，只取第一个元素", map[string]interface{}{
				"original_value":  v,
				"processed_value": v[0],
			})
			return v[0]
		}
		return nil
	case []string:
		if len(v) > 0 {
			ms.logger.Debug("处理字符串数组类型值，只取第一个元素", map[string]interface{}{
				"original_value":  v,
				"processed_value": v[0],
			})
			return v[0]
		}
		return nil
	case []int:
		if len(v) > 0 {
			ms.logger.Debug("处理整数数组类型值，只取第一个元素", map[string]interface{}{
				"original_value":  v,
				"processed_value": v[0],
			})
			return v[0]
		}
		return nil
	case []float64:
		if len(v) > 0 {
			ms.logger.Debug("处理浮点数组类型值，只取第一个元素", map[string]interface{}{
				"original_value":  v,
				"processed_value": v[0],
			})
			return v[0]
		}
		return nil
	default:
		return value
	}
}
